﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QldtSdh.GUI.DaoTao
{
    using BLL;
    using DAL;
    using DAL.Models;
    using GUI.Utils;
    using QldtSdh.GUI.Common;
    using QldtSdh.Utils;

    public partial class UcTaoLopHocPhanTrongKHDT : QldtSdh.GUI.Common.BaseUserControl, QldtSdh.GUI.Common.IHocKyChangable
    {
        private bool _DoNotLoadDanhSachLopKhoaNganh = false;
        private bool _DoNotLoadDanhSachHocPhanDuKien = false;

        //private HocKy _HocKy;

        #region Các thuộc tính
        /// <summary>
        /// Học kỳ đang lập Kế hoạch đào tạo
        /// </summary>
        public DAL.Models.HocKy HocKy { get; private set; }

        private KhoaHoc SelectedKhoaHoc
        {
            get
            {
                KhoaHoc khoaHoc = null;
                if (bsKhoaHoc.Current != null)
                    khoaHoc = bsKhoaHoc.Current as KhoaHoc;
                return khoaHoc;
            }
        }

        private CoSoDaoTao SelectedCoSoDaoTao
        {
            get
            {
                CoSoDaoTao coso = null;
                if (bsCoSoDaoTao.Current != null)
                    coso = bsCoSoDaoTao.Current as CoSoDaoTao;
                return coso;
            }
        }

        private LopKhoaNganh SelectedLopKhoaNganh
        {
            get
            {
                LopKhoaNganh lop = null;
                if (bsLopKhoaNganh.Current != null)
                    lop = bsLopKhoaNganh.Current as LopKhoaNganh;
                return lop;
            }
        }
        #endregion

        public UcTaoLopHocPhanTrongKHDT()
        {
            InitializeComponent();

            gridLopKhoaNganh.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: false);
            gridLopKhoaNganh.AddRowIndexing();
            gridHocPhanTrongKHDT.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: true);
            gridHocPhanTrongKHDT.AddRowIndexing();
        }

        public void ChangeHocKy(DAL.Models.HocKy newHocKy)
        {
            this.SetHocKy(newHocKy);
        }

        internal void SetHocKy(DAL.Models.HocKy hocKy)
        {
            // Thiết lập học kỳ lập kế hoạch đào tạo
            // -> 
            this.HocKy = hocKy;

            _DoNotLoadDanhSachLopKhoaNganh = true;
            try
            {
                using (var db = CEMS4UG_DHKHContext.GetContext())
                {
                    // 1. Nạp danh sách các Khoá học còn hoạt động trong học kỳ này. Chọn 1 Khoá học mặc định
                    // TODO: CHỈ NẠP NHỮNG KHOÁ HỌC DIỄN RA TRƯỚC HỌC KỲ ĐANG ĐƯỢC CHỌN THÔI!
                    var lstKhoaHoc = BizKhoaHoc.LayDanhSachKhoaHocConHoatDongTrongHocKy(this.HocKy, db);
                    bsKhoaHoc.DataSource = lstKhoaHoc;
                    cbxKhoaHoc.DisplayMember = "TenKhoaHoc";
                    cbxKhoaHoc.DataSource = bsKhoaHoc;

                    // 2. Nạp danh sách các Cơ sở đào tạo
                    bsCoSoDaoTao.DataSource = BizCoSoDaoTao.GetListCoSoDaoTao(db);
                    cbxCoSoDaoTao.DisplayMember = "TenCoSoDaoTao";
                    cbxCoSoDaoTao.DataSource = bsCoSoDaoTao;
                }
            }
            finally
            {
                _DoNotLoadDanhSachLopKhoaNganh = false;
            }

            // Cập nhật GUI theo các lựa chọn mặc định ban đầu.
            NapDanhSachLopKhoaNganh();
        }

        private void bsLopKhoaNganh_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadDanhSachHocPhanDuKien)
                return;
            UpdateGuiBySelectedLopKhoaNganh();
        }

        private void UpdateGuiBySelectedLopKhoaNganh()
        {
            var lopKhoaNganh = this.SelectedLopKhoaNganh;
            if (lopKhoaNganh == null)
            {
                bsHocPhanTrongKHDT.DataSource = null;
                lblDanhSachHocPhanDuKien_Title.Text = "";
            }
            else
            {
                bsHocPhanTrongKHDT.DataSource = BizDaoTao.GetListTinhTrangMoLopHocPhanTrongKHDT(lopKhoaNganh, HocKy);
                lblDanhSachHocPhanDuKien_Title.Text = string.Format("Kế hoạch đào tạo cho lớp khoá-ngành {0}", lopKhoaNganh.TenLopKhoaNganh);
            }

            gridHocPhanTrongKHDT.SetDataSource(bsHocPhanTrongKHDT);
        }

        private void NapDanhSachLopKhoaNganh()
        {
            _DoNotLoadDanhSachHocPhanDuKien = true;
            bsLopKhoaNganh.DataSource = BizDaoTao.GetListLopKhoaNganh(this.SelectedKhoaHoc, this.HocKy, this.SelectedCoSoDaoTao);
            gridLopKhoaNganh.SetDataSource(bsLopKhoaNganh);
            _DoNotLoadDanhSachHocPhanDuKien = false;

            if (_DoNotLoadDanhSachHocPhanDuKien)
                return;
            UpdateGuiBySelectedLopKhoaNganh();
        }

        private void bsKhoaHoc_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadDanhSachLopKhoaNganh)
                return;
            NapDanhSachLopKhoaNganh();
        }

        private void bsCoSoDaoTao_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadDanhSachLopKhoaNganh)
                return;
            NapDanhSachLopKhoaNganh();
        }

        private void btnTaoLopHocPhan_Click(object sender, EventArgs e)
        {
            CoSoDaoTao coSoDaoTao = this.SelectedCoSoDaoTao;
            if (coSoDaoTao == null)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn cơ sở đào tạo trước khi thực hiện thao tác này!");
                return;
            }

            LopKhoaNganh lopKhoaNganh = null;
            if (chkChiTaoLopHocPhanChoLopKhoaNganhDangChon.Checked)
            {
                lopKhoaNganh = SelectedLopKhoaNganh;
                if (lopKhoaNganh == null)
                {
                    DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn một lớp khoá-ngành trước khi thực hiện thao tác này!");
                    return;
                }
            }
            var lst = BizDaoTao.GetListHocPhanTrongKHDTChuaDuocMoLopHocPhan(lopKhoaNganh, coSoDaoTao, HocKy);
            if (lst.Count == 0)
            {
                DialogUtils.ShowMessage("Tất cả các học phần đều được mở lớp!");
                return;
            }

            if (!DialogUtils.Confirmed("Chương trình chuẩn bị tạo {0} lớp học phần.\nBạn muốn tiếp tục không?", lst.Count))
                return;

            picProgress.Visible = true;

            try
            {
                var n = BizDaoTao.TaoLopHocPhan(lst, HocKy, coSoDaoTao);
                DialogUtils.ShowMessage(string.Format("Đã tạo {0} lớp học phần trong học kỳ {1} tại cơ sở đào tạo {2}",
                    n, HocKy.TenHocKyDayDu, coSoDaoTao.TenCoSoDaoTao));
                UpdateGuiBySelectedLopKhoaNganh();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Xuất hiện lỗi trong quá trình tạo lớp học phần\n.Chi tiết lỗi: {0}", exc.ToString());
            }

            picProgress.Visible = false;
        }

        private void lblClose_Click(object sender, EventArgs e)
        {
            Program.FormMain.CloseUcAndShowWelcome(this);
        }
    }
}
